<?php
require "../../../global.php";

/*信用卡支付订单返回接收页面
 *注意:由于可能多次返回支付结果,故需要商户的系统有能力处理多次返回的情况.
*/

//商户证书
$md5cert = '36451620901856065970269330053246181842887948974683586506701057676567422219322046647065958403072037230625137727476541950060891824';

//商户订单号
$pBillNo = $_GET['pBillNo'];//这里的订单号映射的订单号

//商户号
$pMerCode = $_GET['pMerCode'];

//支付币种
$pCurrency = $_GET['pCurrency'];

//交易金额
$pAmount = $_GET['pAmount'];

//商户录入日期
$pDate = $_GET['pDate'];

//结果标志: Y– 成功  N – 失败 S-录入成功 F-录入失败
$pSucc = $_GET['pSucc'];

//返回的加密方式
$pRetEncodeType = $_GET['pRetEncodeType']; 

//附加信息
/*这里获取的是完整的订单号  
 * 格式如:t0000087j1t0000088j113^17228,36.8    * ^符号后面的是金额列表,多个用逗号分隔
 * 
 */
$pAttach = $_GET['pAttach'];


//数字签名
$pSignature = $_GET['pSignature'];

//IPS处理时间
$pIpsBankTime = $_GET['pIpsBankTime'];

//IPS订单号
$pIpsBillNo = $_GET['pIpsBillNo'];//只是前30位，不一定全，所以以$pAttach为准

//银行返回信息
$pMsg = $_GET['pMsg'];

//验证明文
$content = $pBillNo . $pAmount . $pDate . $pSucc . $pIpsBillNo . $pCurrency;



/********************************非直连返回处理逻辑*****************************
1.数据验证 
  可以使用IPS 提供的签名验证组件，对返回的关键信息进行验证，以确保订单信息 
  安全，防止黑客恶意攻击及篡改订单信息。
2.判断 pSucc
  若 pSucc 等“S”, 表示录入成功; 若等于“F”, 表示录入失败, 此时无需再进行以下步骤。
  若 pSucc 等“Y”, 表示支付成功; 若等于“N”, 表示支付失败。
3.判断订单号和金额 
  为安全起见，商户应该将自己系统中存放的订单信息和IPS 返回的订单信息进行比对， 
  以保证订单数据真实可信。建议比对的项：订单编号和订单金额。 
4.在成功完成以上步骤后，商户可以根据需要进行其他操作。
*******************************************************************************/
//验证结果
$verify = false;
			
//先验证签名，再判断交易是否成功
//MD5WithRSA验证
if ($pRetEncodeType == '11')
{	
	//创建com组件
	$MD5withRSA = new COM('IpsVerify.RSAMd5');
	
	//使用公钥文件的绝对路径
	$result = $MD5withRSA->VerifyMessage("C:\\PubKey\\pub.txt", $content, $pSignature);

	/*******************
	返回代码定义
	0   表示签名验证成功
	-1  表示系统错误
	-2  表示文件绑定错误
	-3  表示读取公钥失败
	-4  表示签名长度错
	-5  表示签名验证失败
	-99 表示系统锁定失败
	*******************/ 
	if ($result == 0)
	{
		$verify = true;
	}
}

//md5摘要验证  
if($pRetEncodeType == '12')
{
	//明文=订单编号+订单金额+订单日期+成功标志+IPS订单编号+币种+商户证书
	$content = $content . $md5cert;

	$signature_local = MD5($content);

	if ($signature_local == $pSignature)
	{
		$verify = true;
	}    
}

//签名验证结果
if($verify)
{
	switch($pSucc)
	{
		Case "S":
			//录入结果成功
			echo '录入成功';
			break;

		Case "F":
			//录入结果失败，商户可以记录失败原因或做其他操作
			echo '录入失败' . $pMsg;
			break;
			
		Case "Y":
			//支付结果成功，对返回的订单信息和商户数据库里的订单信息做核对--主要核对订单号，金额，日期等是否一致

			require RootDir."/inc/dabase_mysql.php";
			$mydb=new YYBDB();
			//获取各个订单号 $pBillNo为映射订单号
			$pBillNo=substr($pBillNo, 0,-2);//去除最后两位随机数
			$sql="select * from ".DQ."onlingpayorder where onlingpayorder1='".$pBillNo."'";
			$res=$mydb->query($sql);
			if($rs=$mydb->db_fetch_array($res)){
				$realorder=$rs["onlingpayorder2"];
			}
			
			if($realorder=="") die("参数错误");
			
			preg_match("/[t|h][\d]{7}j[\d]{1}/",$realorder,$orderlist);//获取订单号列表
			$pAmounts=preg_replace("/^[\w]+\^/","",$realorder);
			$pAmountsarr=explode(",", $pAmounts);
			$i=0;
			$dingdan="";
			foreach ($orderlist as $order){
			
				$orderno=preg_replace("/j[\d]$/", "", $order);
				$payflag=str_replace($orderno, "", $order);
				if($payflag=="j1"){
						$sql2="pay3=".$pAmountsarr[$i].",pay4=".time().",pay5='环讯信用卡',pay6=1";
				}
				if($payflag=="j2"){
						$sql2="pay7=".$pAmountsarr[$i].",pay8=".time().",pay9='环讯信用卡',pay10=1";
				}
				$sql="update ".$SystemConest[7]."pay set ".$sql2." where pay1='".$orderno."'";
				 $mydb->db_query($sql);
				$i++;
				$dingdanlist.=$orderno."|".$SystemConest[7]."|".$payflag.",";
		   }
		
			 //支付成功，执行发送邮件操作
			 $dingdan=substr($dingdan, 0,-1);
			 echo "<iframe  src='/sendmail/paysuss-orderlist-".$dingdanlist."' frameborder=0 scrolling=no width=1 height=1></iframe>";
			 unset($rs);
			 $url="/pay/showpaysuss-orderlist-".$dingdanl."";
			 gourl($url,1);
			
			break;

		Case "N":
			//支付结果失败，商户可以记录失败原因或做其他操作
			echo '支付失败' . $pMsg;
			break;
	}
}
else
{
	echo '签名验证失败';
}
?>
